ListNode* reverseBetween(ListNode* head, int m, int n) {
        // write code here
        if(m == n || head == nullptr || head->next==nullptr ){
            return head;
        }
        ListNode* dummy = new ListNode(-1);//指定一个虚拟节点指向头结点
        dummy->next = head;//使得虚拟节点指向头结点
        ListNode* curr = head;
        ListNode* prev = dummy;
        for (int i=0 ; i < m - 1 ; i++){
            curr = curr->next;//循环使得curr指针指向第m个节点
            prev = prev->next;//循环使得prev指针指向第m个节点的前一个节点
        }
        
        for( int i = 0;i < n - m ; i++ ){
            ListNode* Next = curr->next;//创建一个Next指针指向当前curr指针的下一个节点
            curr->next = curr->next->next;//使得curr的指针指向curr的下一个节点的下一个节点
            Next->next = prev->next;//使得Next的指针指向prev的下一个节点 ，注意不要写成curr，因为curr一直在变化
            prev->next = Next; //使得prev的指针指向Next节点
        }   
        return dummy->next;//返回虚拟节点的下一个节点地址，注意：不要直接返回prev， 因为当只有一个元素时，prev返回的是虚拟节点
    }
